/**
 * @file mvt_sdns.h
 * @author tangwenjun
 * @brief 宏视MVT-S系列DNS客户端，支持三级DNS配置和独立使能，支持hosts文件配置
 * @version 1.0
 * @date 2022-08-30
 * 
 * @copyright Copyright (c) 2022
 * 
 */
#ifndef __MVT_SDNS_H__
#define __MVT_SDNS_H__

#include "mvdef.h"
#include "mvt_utilities/mvt_socket.h"

#define SDNS_NAMESVR_LEN    32        ///< 域名服务器字符串最长长度
#define SDNS_SYS_SVR_MAX     3
#define SDNS_MOD_SVR_MAX     3
#define SDNS_TOTAL_SVR_MAX   6        ///< 域名服务器最大数量6个

#define SDNS_DEFAULT_TIMEOUT 6*1000   ///< 默认超时
/** 
 * DNS服务器生效顺序为： cust > sys > mod
 * 目前暂时仅支持IPv4的DNS服务器
 * syssvrs配置文件路径：
 *     Linux： /etc/resolv.conf
 * hosts配置文件路径：
 *     Linux:  /etc/hosts
 **/
typedef struct _mvt_dns_hints
{
    mv_s32_t     s32_timeout_ms;    ///< 解析超时时间(单次总超时时间)
    mv_vptr_t    phdl_mvt_log;      ///< (可选)mvt log句柄
    mv_u8_t      u8_retry_round;    ///< 解析超时重试次数(0=默认不重试)
    mv_u8_t      u8_family;         ///< 目标协议簇[mvt_socket_pf_e]
    mv_u8_t      u8_socktype;       ///< DNS socket方式[MVT_TCP_SOCKET(暂不支持) / MVT_UDP_SOCKET(默认)]
    mv_bool_t    bl_use_syssvrs;    ///< 使用系统DNS服务器列表(系统设置;非Linux暂不支持)
    mv_bool_t    bl_use_modsvrs;    ///< 使用模块DNS服务器列表(全局设置)
    mv_bool_t    bl_use_hostslist;  ///< 使用系统Hosts文件(非Linux暂不支持)
    mv_u8_t      au8_reserve_pad[2];///< (保留)
    mv_u8_t      u8_cust_svrs;      ///< 指定DNS服务器数量(当次请求)
    mv_cv8ptr_t *acpv8_cust_svr;    ///< 指定DNS服务器列表
}mvt_sdns_hints_t;

typedef struct _mvt_sdns_result
{
    mvt_sockaddr_t addr;
    struct _mvt_sdns_result *next;
}mvt_sdns_result_t;

/**
 * @brief 强制重新读取系统DNS服务器列表
 * 
 * @return \
 */
mv_void_t mvt_sdns_syssvrs_update(mv_void_t);
/**
 * @brief 更新模块DNS服务器列表
 * 
 * @param u8_num     [in] DNS服务器数量
 * @param acpv8_svrs [in] DNS服务器列表
 * @return \
 * 
 * @note 服务器数量最大为3个
 */
mv_void_t mvt_sdns_modsvrs_update(mv_u8_t u8_num, mv_cv8ptr_t *acpv8_svrs);
/**
 * @brief 域名解析（支持域名格式和IP格式自动识别）
 * 
 * @param cpv8_domain [in] 目标解析域名
 * @param phints      [in] 解析选项
 * @param ppresult    [out] 解析结果缓存链（接口内动态申请）
 * @return 解析结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 * 
 * @attention 注意！ppresult成功获取后，当不再使用时，必须调用mvt_sdns_freeaddrinfo释放掉资源！
 */
mv_s32_t  mvt_sdns_getaddrinfo(mv_cv8ptr_t cpv8_domain, mvt_sdns_hints_t *phints, mvt_sdns_result_t **ppresult);

/**
 * @brief 域名解析结果释放
 * 
 * @param ppresult 解析结果缓存首地址
 * @return \ 
 */
mv_void_t mvt_sdns_freeaddrinfo(mvt_sdns_result_t *presult);

#endif
